home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-06-13 | 12.7 KB | 681 lines | [TEXT/KAHL] |
- ///--------------------------------------------------------------------------------------
- // SpaceGame.c
- //
- // Created: 6/18/92 at 8:03:00 PM
- // By: Tony Myles
- //
- // Copyright: © 1992-93 Tony Myles, All rights reserved worldwide.
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __GAMEUTILS__
- #include <GameUtils.h>
- #endif
-
- #ifndef __DEBUGUTILS__
- #include <DebugUtils.h>
- #endif
-
- #ifndef __SPRITEWORLDUTILS__
- #include <SpriteWorldUtils.h>
- #endif
-
- #ifndef __BLITPIXIE__
- #include <BlitPixie.h>
- #endif
-
- #ifndef __SPACEGAME__
- #include "SpaceGame.h"
- #endif
-
- #ifndef __SHIPSPRITE__
- #include "ShipSprite.h"
- #endif
-
-
- OSErr EnterSpaceGame(void)
- {
- OSErr err = noErr;
-
- // initialize the random number seed
- GetDateTime((unsigned long *)&qd.randSeed);
-
- // initialize SpriteWorld
- err = SWEnterSpriteWorld();
-
- return err;
- }
-
-
- void ExitSpaceGame(void)
- {
- // shut down SpriteWorld
- SWExitSpriteWorld();
- }
-
-
- OSErr CreateSpaceGame(
- SpaceGamePtr *spaceGameP)
- {
- OSErr err = noErr;
- Rect backFrameRect;
- SpaceGamePtr tempSpaceGameP;
-
- *spaceGameP = NULL;
-
- tempSpaceGameP = (SpaceGamePtr)NewPtrClear((Size)sizeof(SpaceGameRec));
-
- if (tempSpaceGameP == NULL)
- {
- err = MemError();
- }
-
- if (err == noErr)
- {
- err = CreateGameWindow(tempSpaceGameP);
- }
-
- if (err == noErr)
- {
- err = CreateGameSpriteWorld(tempSpaceGameP);
- }
-
- if (err == noErr)
- {
- err = CreateGameLayers(tempSpaceGameP);
- }
-
- if (err == noErr)
- {
- err = CreateSplashScreen(tempSpaceGameP);
- }
-
- if (err == noErr)
- {
- err = CreateGameSprites(tempSpaceGameP);
- }
-
- if (err == noErr)
- {
- *spaceGameP = tempSpaceGameP;
- }
-
- if (err != noErr)
- {
- if (tempSpaceGameP != NULL)
- {
- DisposeSpaceGame(tempSpaceGameP);
- }
- }
-
- return err;
- }
-
-
- OSErr CreateGameWindow(
- SpaceGamePtr spaceGameP)
- {
- OSErr err = noErr;
- WindowPtr gameWindP;
-
- gameWindP = SWHasColorQuickDraw() ?
- GetNewCWindow(1000, NULL, (WindowPtr)-1L) :
- GetNewWindow(1000, NULL, (WindowPtr)-1L);
-
- if (gameWindP == NULL)
- {
- err = ResError();
-
- if (err == noErr)
- {
- err = resNotFound;
- }
- }
-
- if (err == noErr)
- {
- SetPort((GrafPtr)gameWindP);
- TextFont(geneva);
- TextSize(9);
- TextFace(normal);
-
- SizeWindow((WindowPtr)gameWindP,
- qd.screenBits.bounds.right - qd.screenBits.bounds.left,
- qd.screenBits.bounds.bottom - qd.screenBits.bounds.top, false);
- MoveWindow((WindowPtr)gameWindP, 0, 0, false);
-
- ShowWindow((WindowPtr)gameWindP);
- FillRect(&gameWindP->portRect, qd.black);
-
- spaceGameP->gameWindP = gameWindP;
- }
-
- return err;
- }
-
-
- OSErr CreateSplashScreen(
- SpaceGamePtr spaceGameP)
- {
- OSErr err = noErr;
- WindowPtr gameWindP = spaceGameP->gameWindP;
- Rect windowRect = gameWindP->portRect;
- Rect titleRect;
- short titleBottom;
-
- if (err == noErr)
- {
- err = SWCreateSpriteFromPictResource(&spaceGameP->titleSpriteP, NULL,
- kSplashPictID, 129, 1, kRegionMask);
- }
-
- if (err == noErr)
- {
- SWAddSprite(spaceGameP->introSpriteLayerP, spaceGameP->titleSpriteP);
- SWAddSpriteLayer(spaceGameP->gameSpriteWorldP, spaceGameP->introSpriteLayerP);
-
- SWLockSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- titleRect = spaceGameP->titleSpriteP->curFrameP->frameRect;
- CenterRect(&gameWindP->portRect, &titleRect);
- titleBottom = titleRect.bottom;
- SWMoveSprite(spaceGameP->titleSpriteP, titleRect.left, titleRect.top);
- SWSetSpriteMoveTime(spaceGameP->titleSpriteP, -1);
-
- SWSetPortToBackGround(spaceGameP->gameSpriteWorldP);
- FillRect(&windowRect, qd.black);
-
- SWUpdateSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- TextFont(systemFont);
- TextSize(12);
- ForeColor(yellowColor);
- titleRect.top = 0;
- titleRect.bottom = 30;
- titleRect.left = 0;
- titleRect.right = StringWidth("\pLoading…");
- CenterRect(&windowRect, &titleRect);
- MoveTo(titleRect.left, titleBottom + ((windowRect.bottom - titleBottom) / 2));
- DrawString("\pLoading…");
- ForeColor(blackColor);
-
- SWUnlockSpriteWorld(spaceGameP->gameSpriteWorldP);
- }
-
- return err;
- }
-
-
- OSErr CreateGameSpriteWorld(
- SpaceGamePtr spaceGameP)
- {
- OSErr err;
-
- err = SWCreateSpriteWorldFromWindow(&spaceGameP->gameSpriteWorldP,
- (CWindowPtr)spaceGameP->gameWindP, NULL);
-
- if (err == noErr)
- {
- SWSetPortToBackGround(spaceGameP->gameSpriteWorldP);
-
- FillRect(&spaceGameP->gameWindP->portRect, qd.black);
-
- SWSetPortToWindow(spaceGameP->gameSpriteWorldP);
- }
-
- return err;
- }
-
-
- OSErr CreateGameLayers(
- SpaceGamePtr spaceGameP)
- {
- OSErr err;
-
- err = SWCreateSpriteLayer(&spaceGameP->introSpriteLayerP);
-
- if (err == noErr)
- {
- err = SWCreateSpriteLayer(&spaceGameP->shipSpriteLayerP);
- }
-
- if (err == noErr)
- {
- err = SWCreateSpriteLayer(&spaceGameP->shotSpriteLayerP);
- }
-
- if (err == noErr)
- {
- err = SWCreateSpriteLayer(&spaceGameP->rockSpriteLayerP);
- }
-
- return err;
- }
-
-
- OSErr CreateGameSprites(
- SpaceGamePtr spaceGameP)
- {
- OSErr err = noErr;
-
- err = CreateShipSprite(&spaceGameP->shipSpriteP);
-
- if (err == noErr)
- {
- InitShipSprite(spaceGameP->shipSpriteP,
- spaceGameP->gameSpriteWorldP,
- spaceGameP->shipSpriteLayerP,
- spaceGameP->shotSpriteLayerP);
- }
-
- if (err == noErr)
- {
- err = CreateShotSpriteArray(spaceGameP->shipSpriteP);
- }
-
- if (err == noErr)
- {
- err = CreateRockSpriteInfo(&spaceGameP->rockSpriteInfoP,
- spaceGameP->gameSpriteWorldP,
- spaceGameP->rockSpriteLayerP);
- }
-
- return err;
- }
-
-
- void DisposeSpaceGame(
- SpaceGamePtr spaceGameP)
- {
- if (spaceGameP->shipSpriteP != NULL)
- {
- DisposeShipSprite(spaceGameP->shipSpriteP);
- }
-
- if (spaceGameP->rockSpriteInfoP != NULL)
- {
- DisposeRockSpriteInfo(spaceGameP->rockSpriteInfoP);
- }
-
- if (spaceGameP->introSpriteLayerP != NULL)
- {
- SWDisposeSpriteLayer(spaceGameP->introSpriteLayerP);
- }
-
- if (spaceGameP->shipSpriteLayerP != NULL)
- {
- SWDisposeSpriteLayer(spaceGameP->shipSpriteLayerP);
- }
-
- if (spaceGameP->shotSpriteLayerP != NULL)
- {
- SWDisposeSpriteLayer(spaceGameP->shotSpriteLayerP);
- }
-
- if (spaceGameP->rockSpriteLayerP != NULL)
- {
- SWDisposeSpriteLayer(spaceGameP->rockSpriteLayerP);
- }
-
- if (spaceGameP->titleSpriteP != NULL)
- {
- SWDisposeSprite(spaceGameP->titleSpriteP, true);
- }
-
- if (spaceGameP->gameSpriteWorldP != NULL)
- {
- SWDisposeSpriteWorld(spaceGameP->gameSpriteWorldP);
- }
-
- if (spaceGameP->gameWindP != NULL)
- {
- DisposeWindow((WindowPtr)spaceGameP->gameWindP);
- }
-
- DisposePtr((Ptr)spaceGameP);
- }
-
-
- void IdleSpaceGame(
- SpaceGamePtr spaceGameP)
- {
- SWLockSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- SWProcessSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- SWAnimateSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- SWUnlockSpriteWorld(spaceGameP->gameSpriteWorldP);
- }
-
-
- void StartSpaceGame(
- SpaceGamePtr spaceGameP)
- {
- SpriteWorldPtr spriteWorldP = spaceGameP->gameSpriteWorldP;
-
- HideCursor();
-
- HideMenuBar(spaceGameP->gameWindP);
-
- spaceGameP->level = 0;
- spaceGameP->score = 0;
- spaceGameP->lives = 4;
-
- SWAddSpriteLayer(spriteWorldP, spaceGameP->shotSpriteLayerP);
- SWAddSpriteLayer(spriteWorldP, spaceGameP->shipSpriteLayerP);
- SWAddSpriteLayer(spriteWorldP, spaceGameP->rockSpriteLayerP);
-
- SetupShipSprite(spaceGameP->shipSpriteP);
- SetupRockSpriteInfo(spaceGameP->rockSpriteInfoP);
-
- SWLockSpriteWorld(spriteWorldP);
- SWUpdateSpriteWorld(spriteWorldP);
-
- SWSetSpriteWorldEraseProc(spriteWorldP, BlitPixieEraseProc);
- SWSetSpriteWorldDrawProc(spriteWorldP, BlitPixieDrawProc);
-
- PlaySpaceGame(spaceGameP);
-
- SWSetSpriteWorldEraseProc(spriteWorldP, SWStdDrawProc);
- SWSetSpriteWorldDrawProc(spriteWorldP, SWStdMaskDrawProc);
-
- SWRemoveSpriteLayer(spriteWorldP, spaceGameP->shotSpriteLayerP);
- SWRemoveSpriteLayer(spriteWorldP, spaceGameP->shipSpriteLayerP);
- SWRemoveSpriteLayer(spriteWorldP, spaceGameP->rockSpriteLayerP);
- SWUpdateSpriteWorld(spriteWorldP);
-
- ShowMenuBar(spaceGameP->gameWindP);
-
- ShowCursor();
- FlushEvents(everyEvent, 0);
- }
-
-
- void PlaySpaceGame(
- SpaceGamePtr spaceGameP)
- {
- Boolean abortGame = false, fireKeyHasLetUp = true;
- long ticks;
- unsigned long frames = 0;
-
- ticks = TickCount();
-
- while ((spaceGameP->lives > 0) && (!abortGame))
- {
- NextLevel(spaceGameP);
-
- while ((spaceGameP->lives > 0) && (!abortGame))
- {
- if (!spaceGameP->shipSpriteP->isAlive)
- {
- NextShip(spaceGameP);
- }
-
- for (frames = 0; (spaceGameP->shipSpriteP->isAlive) && (!abortGame); frames++)
- {
- // fire a shot
- if (KeyIsDown(kUpArrowKey))
- {
- if (fireKeyHasLetUp)
- {
- FireAShot(spaceGameP->shipSpriteP);
-
- fireKeyHasLetUp = false;
- }
- }
- else
- {
- fireKeyHasLetUp = true;
- }
-
- SWProcessSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- SWCollideSpriteLayer(spaceGameP->rockSpriteLayerP, spaceGameP->shotSpriteLayerP);
- SWCollideSpriteLayer(spaceGameP->shipSpriteLayerP, spaceGameP->rockSpriteLayerP);
-
- SWAnimateSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- SystemTask();
-
- abortGame = KeyIsDown(kEscapeKey);
- }
- }
- }
-
- if (KeyIsDown(kOptionKey))
- DebugStrNum("\pFrames Per Second", frames / ((TickCount() - ticks) / 60));
- }
-
-
- void NextLevel(
- SpaceGamePtr spaceGameP)
- {
- short rockNum, numberOfRocks;
- register SpritePtr rockSpriteP;
-
- for (rockSpriteP = NULL; rockSpriteP != NULL;
- rockSpriteP = SWGetNextSprite(spaceGameP->rockSpriteLayerP, rockSpriteP))
- {
- SWRemoveSprite(spaceGameP->rockSpriteLayerP, rockSpriteP);
- }
-
- numberOfRocks = kNumberOfLargeRockSprites / 2;
-
- for (rockNum = 0; rockNum < numberOfRocks; rockNum++)
- {
- rockSpriteP = spaceGameP->rockSpriteInfoP->largeRockSpriteArray[rockNum];
-
- SWAddSprite(spaceGameP->rockSpriteLayerP, rockSpriteP);
- }
- }
-
-
- void NextShip(
- SpaceGamePtr spaceGameP)
- {
- long ticks;
-
- spaceGameP->lives--;
-
- if (spaceGameP->lives > 0)
- {
- ticks = TickCount() + (2 * 60);
-
- while (TickCount() < ticks)
- {
- SWProcessSpriteWorld(spaceGameP->gameSpriteWorldP);
-
- SWAnimateSpriteWorld(spaceGameP->gameSpriteWorldP);
- }
-
- SWSetSpriteVisible((SpritePtr)spaceGameP->shipSpriteP, true);
- SWSetSpriteMoveTime((SpritePtr)spaceGameP->shipSpriteP, kShipMoveTime);
- spaceGameP->shipSpriteP->isAlive = true;
- }
- }
-
-
- void CenterRect(
- Rect* srcRect,
- Rect* dstRect)
- {
- short width = (dstRect->right - dstRect->left);
- short height = (dstRect->bottom - dstRect->top);
-
- dstRect->left = srcRect->left + (((srcRect->right - srcRect->left) / 2) - (width / 2));
- dstRect->top = srcRect->top + (((srcRect->bottom - srcRect->top) / 2) - (height / 2));
- dstRect->right = dstRect->left + width;
- dstRect->bottom = dstRect->top + height;
- }
-
-
- void GenerateStarField(
- GWorldPtr starGWorldP)
- {
- CGrafPtr saveCPort;
- GDHandle saveGDevice;
- PixMapHandle pixMapH;
- unsigned long numberOfStars, numberOfPixels;
- short fieldWidth, fieldHeight;
- short h, v;
- short colorIndex;
- RGBColor foreColor;
- RGBColor saveColor;
- RGBColor starColorArray[21] =
- {
- {
- 26214, 26214, 26214
- },
- {
- 26214, 26214, 26214
- },
- {
- 17476, 17476, 17476
- },
- {
- 17476, 17476, 17476
- },
- {
- 17476, 17476, 17476
- },
- {
- 17476, 17476, 17476
- },
- {
- 13107, 13107, 13107
- },
- {
- 13107, 13107, 13107
- },
- {
- 13107, 13107, 13107
- },
- {
- 8738, 8738, 8738
- },
- {
- 8738, 8738, 8738
- },
- {
- 8738, 8738, 8738
- },
- {
- 0, 0, 4369
- },
- {
- 0, 0, 4369
- },
- {
- 0, 0, 4369
- },
- {
- 0, 4369, 0
- },
- {
- 0, 4369, 0
- },
- {
- 0, 4369, 0
- },
- {
- 4369, 0, 0
- },
- {
- 4369, 0, 0
- },
- {
- 4369, 0, 0
- }
- };
-
- GetGWorld(&saveCPort, &saveGDevice);
- SetGWorld(starGWorldP, NULL);
- pixMapH = GetGWorldPixMap(starGWorldP);
-
- (void)LockPixels(pixMapH);
-
- GetForeColor(&saveColor);
- SetRGBColor(&foreColor, 0, 0, 0);
- RGBForeColor(&foreColor);
- FillRect(&starGWorldP->portRect, qd.black);
-
- fieldWidth = starGWorldP->portRect.right - starGWorldP->portRect.left;
- fieldHeight = starGWorldP->portRect.bottom - starGWorldP->portRect.top;
-
- numberOfPixels = (unsigned long)fieldHeight * (unsigned long)fieldWidth;
- numberOfStars = numberOfPixels / 80U;
-
- while (numberOfStars--)
- {
- colorIndex = GetRandom(0, 20);
-
- RGBForeColor(starColorArray + colorIndex);
-
- MoveTo(GetRandom(0, fieldWidth), GetRandom(0, fieldHeight));
- Line(0, 0);
- }
-
- numberOfStars = GetRandom(1, 6);
-
- while (numberOfStars--)
- {
- h = GetRandom(0, fieldWidth);
- v = GetRandom(0, fieldHeight);
-
- // across
- RGBForeColor(starColorArray + 6);
- MoveTo(h - 1, v + 1);
- Line(2, 0);
-
- // down
- RGBForeColor(starColorArray + 2);
- MoveTo(h, v);
- Line(0, 1);
-
- SetRGBColor(&foreColor, 36128, 36128, 36128);
- RGBForeColor(&foreColor);
- Line(0, 1);
-
- RGBForeColor(starColorArray + 2);
- Line(0, 1);
-
- RGBForeColor(starColorArray + 6);
- Line(0, 0);
- }
-
- if (GetRandom(0, 1))
- {
- CIconHandle cIconH;
- Rect iconRect;
-
- cIconH = GetCIcon(kSuperNovaID);
-
- if (cIconH != NULL)
- {
- iconRect = (**cIconH).iconPMap.bounds;
-
- OffsetRect(&iconRect, GetRandom(20, fieldWidth - 20), GetRandom(20, fieldHeight - 20));
-
- PlotCIcon(&iconRect, cIconH);
- DisposeCIcon(cIconH);
- }
- }
-
- UnlockPixels(pixMapH);
- RGBForeColor(&saveColor);
- SetGWorld(saveCPort, saveGDevice);
- }
-
-
- void SetRGBColor(
- RGBColor *color,
- short red,
- short green,
- short blue)
- {
- color->red = red;
- color->green = green;
- color->blue = blue;
- }
-